//事件总线 类似于明星的经纪人
class EventBus{
  constructor(){
    //存储事件和监听函数的映射
    this.events = new Map();//set(key,value) get(key)
  }
  //给某个类型的事件添加监听函数
  addListener(type,callback){
    //先取出此事件对应的监听 函数数组,如果是第一次，肯定取不到，就返回空数组
    let callbacks = this.events.get(type)||[];
    //向数组中添加一个新的回调函数
    callbacks.push(callback);
    //重写保存回去
    this.events.set(type,callbacks);
  }
  emit(type){
    //取出此事件对应的回调函数数组
    let callbacks = this.events.get(type)||[];
    //把数组进行依次调用
    callbacks.forEach(callback=>callback());
  }
}
//发布者 类似于明星
class Publisher{
    constructor(eventBus) {
        this.eventBus = eventBus;
    }
    publish(type){
        this.eventBus.emit(type);
    }
}
//订阅者 明星的粉丝
class Subscriber{
  //订阅eventBus的song这个事件
  constructor(eventBus,type){
    //给事件总线添加一个song事件的监听函数，当song事件派发的时候，执行当前订阅者的update方法
    eventBus.addListener(type,this.update);
  }
  update(){
    console.log('买票看演唱会');
  }
}
debugger
//创建一个事件总线，也就是明星的经纪人
const eventBus = new EventBus();
//创建一个发布者，也就是一个明星
const publisher = new Publisher(eventBus);
//创建2个粉丝，粉丝向经纪人订阅明星的演唱会，以后明星演唱会的时候记得通知我
const subscriber1 = new Subscriber(eventBus,'song');
const subscriber2 = new Subscriber(eventBus,'song');
//当明星要开演唱会的时候，就会发布一个事件，内部其实是发布给经纪人一个人，
//但是经纪人会通知所有的粉丝，也就是所有的订阅者执行更新操作
publisher.publish('song');